package cn.doitedu.javase.blocking_queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class _01_阻塞队列基本api示例 {

    public static void main(String[] args) throws InterruptedException {

        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(3);

        // 往队列中放数据
        queue.put("a");
        queue.put("b");
        queue.put("c");

        // queue.put("d");  // 如果队列已满，则会一直阻塞等待空间可用
        boolean d1 = queue.add("d");// 如果放入成功，返回true；如果队列已满，则直接抛出异常
        boolean d = queue.offer("d");  // 如果队列已满，则返回false；否则返回true
        boolean d2 = queue.offer("d", 5, TimeUnit.SECONDS);// 如果队列已满，它会阻塞等待5s；如果还没空间就返回false
        System.out.println(d2);


        // 从队列中取数据
        String take1 = queue.take(); // 从头部获取并移除元素，如果队列为空，则会阻塞等待直到有可用元素为止
        System.out.println(take1);


        String poll = queue.poll(); // 从头部获取并移除元素，如果队列为空，可以等待指定的时长后再返回；如果没有数据返回null
        System.out.println(poll);

        //String poll3 = queue.poll(10,TimeUnit.SECONDS);
        //System.out.println(poll3);



        String peek1 = queue.peek();
        System.out.println(peek1);

        String peek2 = queue.peek();// 从头部读取一个数据，不移除；且不阻塞，队列有数据返回数据；队列为空返回null
        System.out.println(peek2);


    }

}
